package progbalao;

/**
 * inicializando os atributos.
 *
 * @author thiagoj e Mariana M.
 */
public class Balao {

	private int id;
	private String cidade;
	private double latitude;
	private double longitude;
	private double altitude;
	private int bateria;
	private double distancia;
	private Balao oeste;
	private Balao leste;

	/**
	 * Construtor Padrao
	 *
	 * @param id
	 * @param latitude
	 * @param longitude
	 * @param altitude
	 * @param bateria
	 */
	public Balao(int id, String cidade, double latitude, double longitude, double altitude, int bateria) {
		this.id = id;
		this.cidade = cidade;
		this.latitude = latitude;
		this.longitude = longitude;
		this.altitude = altitude;
		this.bateria = bateria;
		this.oeste = null;
		this.leste = null;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public double getLatitude() {
		return latitude;
	}

	public void setLatitude(double latitude) {
		this.latitude = latitude;
	}

	public double getLongitude() {
		return longitude;
	}

	public void setLongitude(double longitude) {
		this.longitude = longitude;
	}

	public double getAltitude() {
		return altitude;
	}

	public void setAltitude(double altitude) {
		this.altitude = altitude;
	}

	public int getBateria() {
		return bateria;
	}

	public void setBateria(int bateria) {
		this.bateria = bateria;
	}

	public double getDistancia() {
		return distancia;
	}

	public void setDistancia(double distancia) {
		this.distancia = distancia;
	}

	public Balao getOeste() {
		return oeste;
	}

	public void setOeste(Balao oeste) {
		this.oeste = oeste;
	}

	public Balao getLeste() {
		return leste;
	}

	public void setLeste(Balao leste) {
		this.leste = leste;
	}

	/**
	 * Verifica qual lado está o balão
	 *
	 * @param balao
	 * @return Retorna 1 para Leste e 0 para Oeste
	 */
	public int vizinho(Balao balao) {
		if (this.longitude > balao.getLongitude()) {
			return 0;
		}

		return 1;

	}

	/**
	 * Calcula a distancia através da latitude de A e de B
	 *
	 * @param lat1 Latitude de A
	 * @param lat2 Latitude de B
	 * @param lon1 Longitude de A
	 * @param lon2 Longitude de B
	 * @param el1 Altitude de A
	 * @param el2 Altitude de B
	 * @return Distancia entre os dois em metros
	 */
	private double distance(double lat1, double lat2, double lon1, double lon2,
			double el1, double el2) {

		final int R = 6371; // Radius of the earth

		Double latDistance = deg2rad(lat2 - lat1);
		Double lonDistance = deg2rad(lon2 - lon1);
		Double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
				+ Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
				* Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
		Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
		double distance = R * c * 1000; // convert to meters

		double height = el1 - el2;
		distance = Math.pow(distance, 2) + Math.pow(height, 2);
		return Math.sqrt(distance);
	}

	private double deg2rad(double deg) {
		return (deg * Math.PI / 180.0);
	}

	/**
	 * Calcula a distancia entre o balão atual e o enviado
	 *
	 * @param balao
	 * @return retorna em metros
	 */
	public double distancia(Balao balao) {
		return this.distance(this.latitude, balao.latitude, this.longitude, balao.longitude, this.altitude, balao.altitude);
	}

	/**
	 * Opcao 1 leste, 2 oeste, 3 cima, 4 baixo
	 *
	 * @param direcao
	 * @param cascata
	 */
	public void mover(int direcao, int cascata) {
		if (direcao == 1) {
			this.longitude += 0.01;
			if (cascata == 0 || cascata == 1) {
				if (this.leste != null) {
					this.leste.mover(1, 1);
				}
			}
			if (cascata == 0 || cascata == 2) {
				if (this.oeste != null) {
					this.oeste.mover(1, 2);
				}
			}




		} else if (direcao == 2) {
			this.longitude -= 0.01;
			if (cascata == 0 || cascata == 1) {
				if (this.leste != null) {
					this.leste.mover(2, 1);
				}
			}
			if (cascata == 0 || cascata == 2) {
				if (this.oeste != null) {
					this.oeste.mover(2, 2);
				}
			}



		} else if (direcao == 3) {
			this.altitude += 1000;
			if (cascata == 0 || cascata == 1) {
				if (this.leste != null) {
					this.leste.mover(4, 1);
				}
			}
			if (cascata == 0 || cascata == 2) {
				if (this.oeste != null) {
					this.oeste.mover(4, 2);
				}
			}
			


		} else if (direcao == 4) {
			this.altitude -= 1000;
			if (cascata == 0 || cascata == 1) {
				if (this.leste != null) {
					this.leste.mover(3, 1);
				}
			}
			if (cascata == 0 || cascata == 2) {
				if (this.oeste != null) {
					this.oeste.mover(3, 2);
				}
			}
			


		}

	}
}
